/***********************************************
 @Name :        qian
 @Time :        2025-6-22
 @Email :       13347217372@163.com
 @Comment :     功能窗口 智能家居（修复后，完善音乐播放功能）
 @FileName :    widget_funcc_smart_home.cpp
 @Version :     1.2
************************************************/

#include "widget_funcc_smart_home.h"
#include "ui_widget_funcc_smart_home.h"
#include "smart_home_camera.h"  
#include "musicplayerwidget.h"  // 引入音乐播放器头文件
#include <QFont>
#include <QPixmap>
#include <QVBoxLayout>
#include <QDebug>

// 构造函数：初始化界面和功能组件
Widget_funcC_Smart_Home::Widget_funcC_Smart_Home(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget_funcC_Smart_Home),
    m_musicPlayer(nullptr)  // 初始化音乐播放器指针为null
{
    ui->setupUi(this);

    initMusicPlayer();      // 优先初始化音乐播放器
    
    initDeviceUI();         // 初始化设备图标和文本
    initSignals();          // 连接信号与槽
}

// 析构函数：释放资源
Widget_funcC_Smart_Home::~Widget_funcC_Smart_Home()
{
    delete ui;
    // 音乐播放器由父窗口管理，无需手动删除
}

// 初始化音乐播放器并集成到界面
void Widget_funcC_Smart_Home::initMusicPlayer()
{
    // 创建音乐播放器实例
    m_musicPlayer = new MusicPlayerWidget(this);
    
    // 准备三首歌曲信息（音频路径+歌词JSON文件路径）
    QList<SongInfo> songList;
    songList.append({
        "鹿 be free",
        "尚雯婕",
        "http://music.163.com/song/media/outer/url?id=449818326.mp3",  // 替换为实际音频文件路径
        "E:/Qt_project/Qt_hqyj_2503/Lyrics/lyric1.json" // 第一首歌的歌词JSON
    });
    songList.append({
        "灯火里的中国",
        "周深",
        "http://music.163.com/song/media/outer/url?id=1837528900.mp3",   // 替换为实际音频文件路径
        "E:/Qt_project/Qt_hqyj_2503/Lyrics/lyric3.json" // 第三首歌的歌词JSON
    });
    songList.append({
        "行走的鱼 (live)",
        "陈楚生",
        "http://music.163.com/song/media/outer/url?id=2729274074.mp3",   // 替换为实际音频文件路径
        "E:/Qt_project/Qt_hqyj_2503/Lyrics/lyric4.json" // 第四首歌的歌词JSON
    });
    
    // 设置歌曲列表到播放器
    m_musicPlayer->setSongList(songList);
    
    // musicLayout 是一个用于管理 m_musicPlayer 布局的垂直布局管理器，
    //它的作用是将音乐播放器组件正确地放置到界面的预留区域（ui->widget_20）中，并控制其布局行为
    QVBoxLayout *musicLayout = new QVBoxLayout(ui->widget_20);
    musicLayout->addWidget(m_musicPlayer);
    
    //摄像头
    if(!ui->widget_8->layout()){
        ui->widget_8->setLayout(new QVBoxLayout());
        ui->widget_8->layout()->setContentsMargins(0,0,0,0);
    }
    Smart_Home_Camera * label_Camera=new Smart_Home_Camera(ui->widget_8);
    
    ui->widget_8->layout()->addWidget(label_Camera);
}

// 初始化设备UI（图标、文本、状态按钮）
void Widget_funcC_Smart_Home::initDeviceUI()
{
        ui->label_return_home->setPixmap(QPixmap(":/状态按钮_关"));
        ui->label_run_home->setPixmap(QPixmap(":/状态按钮_关"));
        ui->label_get_up->setPixmap(QPixmap(":/状态按钮_关"));
        ui->label_sleep->setPixmap(QPixmap(":/状态按钮_关"));
        ui->label_cleaner->setPixmap(QPixmap(":/状态按钮_开"));
        ui->label_Router->setPixmap(QPixmap(":/状态按钮_开"));
        ui->label_curtain->setPixmap(QPixmap(":/状态按钮_开"));
        ui->label_fridge->setPixmap(QPixmap(":/状态按钮_开"));
        ui->label_air_conditioner->setPixmap(QPixmap(":/状态按钮_开"));
        ui->label_light->setPixmap(QPixmap(":/状态按钮_开"));
        
        
        ui->label_return_text->setText("归家");
        ui->label_return_text->setFont(QFont("楷体",12));
        ui->label_return_air_conditioner->setPixmap(QPixmap(":/img/air_conditioner_close.png"));
        ui->label_return_light->setPixmap(QPixmap(":/img/light_close.png"));
        
        ui->label_run_text->setText("离家");
        ui->label_run_text->setFont(QFont("楷体",12));
        ui->label_run_home_light->setPixmap(QPixmap(":/img/light_close.png"));
        ui->label_run_home_cleaner->setPixmap(QPixmap(":/img/cleaner_close.png"));
        ui->label_run_home_curtain->setPixmap(QPixmap(":/img/curtain_close.png"));
        
        ui->label_get_up_text->setText("起床");
        ui->label_get_up_text->setFont(QFont("楷体",12));
        ui->label_get_up_light->setPixmap(QPixmap(":/img/light_close.png"));
        ui->label_get_up_curtain->setPixmap(QPixmap(":/img/curtain_close.png"));
        
        ui->label_sleep_text->setText("睡觉");
        ui->label_sleep_text->setFont(QFont("楷体",12));
        ui->label_sleep_light->setPixmap(QPixmap(":/img/light_open.png"));
        ui->label_sleep_curtain->setPixmap(QPixmap(":/img/curtain_open.png"));
        
        ui->label_cleaner_text->setText("扫地机");
        ui->label_cleaner_text->setFont(QFont("楷体",12));
        ui->label_cleaner_status->setText("NO");
        ui->label_cleaner_status->setFont(QFont("楷体",12));
        ui->label_cleaner_pic->setPixmap(QPixmap(":/img/cleaner_open.png"));
        
        ui->label_Router_text->setText("路由器");
        ui->label_Router_text->setFont(QFont("楷体",12));
        ui->label_Router_status->setText("NO");
        ui->label_Router_status->setFont(QFont("楷体",12));
        ui->label_Router_pic->setPixmap(QPixmap(":/img/Router_open.png"));
        
        ui->label_curtain_text->setText("窗帘");
        ui->label_curtain_text->setFont(QFont("楷体",12));
        ui->label_curtain_status->setText("NO");
        ui->label_curtain_status->setFont(QFont("楷体",12));
        ui->label_curtain_pic->setPixmap(QPixmap(":/img/curtain_open.png"));
        
        ui->label_fridge_text->setText("冰箱");
        ui->label_fridge_text->setFont(QFont("楷体",12));
        ui->label_fridge_status->setText("NO");
        ui->label_fridge_status->setFont(QFont("楷体",12));
        ui->label_fridge_pic->setPixmap(QPixmap(":/img/fridge_open.png"));
        
        ui->label_air_conditioner_text->setText("空调");
        ui->label_air_conditioner_text->setFont(QFont("楷体",12));
        ui->label_air_conditioner_status->setText("NO");
        ui->label_air_conditioner_status->setFont(QFont("楷体",12));
        ui->label_air_conditioner_pic->setPixmap(QPixmap(":/img/air_conditioner_open.png"));
        
        ui->label_light_text->setText("灯");
        ui->label_light_text->setFont(QFont("楷体",12));
        ui->label_light_status->setText("NO");
        ui->label_light_status->setFont(QFont("楷体",12));
        ui->label_light_pic->setPixmap(QPixmap(":/img/light_open.png"));
}

// 连接所有按钮的信号与槽
void Widget_funcC_Smart_Home::initSignals()
{
    //signals_start 是 Button_home_start 类中声明的一个信号，
    //用于在按钮被点击时，向关联的槽函数（Slot）传递当前按钮的状态（如 bool 类型的 start，true 表示 “开启”，false 表示 “关闭”）。
    //connect会将 bool 类型的 start，true 表示 “开启”，false 表示 “关闭”给slots_button_start作为参数，
    // 场景模式按钮
    connect(ui->label_return_home, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_run_home, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_get_up, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_sleep, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    
    // 设备控制按钮
    connect(ui->label_cleaner, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_Router, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_curtain, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_fridge, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_air_conditioner, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
    connect(ui->label_light, &Button_home_start::signals_start, 
            this, &Widget_funcC_Smart_Home::slots_button_start);
}

// 按钮点击处理槽函数
void Widget_funcC_Smart_Home::slots_button_start(bool start)
{
    QObject *senderBtn = sender();  // 获取触发信号的按钮

    // -------------------------- 归家/离家模式（互斥） --------------------------
    if (senderBtn == ui->label_return_home) {
        ui->label_return_home->set_start(start);
        ui->label_run_home->set_start(!start);  // 离家状态取反
    } else if (senderBtn == ui->label_run_home) {
        ui->label_run_home->set_start(start);
        ui->label_return_home->set_start(!start);  // 归家状态取反
    }

    // 根据归家状态更新设备联动 获取当前归家模式的激活状态（true=激活，false=未激活）
    bool isReturnHome = ui->label_return_home->get_start();
    updateSceneDevices(
        isReturnHome,
        ui->label_return_air_conditioner, ui->label_return_light,
        ui->label_run_home_light, ui->label_run_home_cleaner, ui->label_run_home_curtain
    );

    // -------------------------- 起床/睡觉模式（互斥） --------------------------
    if (senderBtn == ui->label_get_up) {
        ui->label_get_up->set_start(start);
        ui->label_sleep->set_start(!start);  // 睡觉状态取反
    } else if (senderBtn == ui->label_sleep) {
        ui->label_sleep->set_start(start);
        ui->label_get_up->set_start(!start);  // 起床状态取反
    }

    // 根据起床状态更新设备联动
    bool isGetUp = ui->label_get_up->get_start();
    updateSceneDevices(
        isGetUp,
        ui->label_get_up_light, ui->label_get_up_curtain,
        ui->label_sleep_light, ui->label_sleep_curtain
    );

    // -------------------------- 独立设备控制 --------------------------
    // 扫地机
    // 若点击的是扫地机按钮
    if (senderBtn == ui->label_cleaner) {
        // 更新扫地机按钮的状态（开启/关闭）
        ui->label_cleaner->set_start(start);
        // 调用通用设备更新函数，同步更新图标和状态文本
        updateDeviceStatus(
            ui->label_cleaner_pic, // 显示扫地机图标的标签
            ui->label_cleaner_status,// 显示扫地机状态的标签
            ui->label_cleaner->get_start(),// 当前状态（是否开启）
            ":/img/cleaner_open.png", ":/img/cleaner_close.png",// 开启\关闭状态的图标路径
            "NO", "OFF"// 开启\关闭时显示的文本
        );
    }

    // 路由器
    if (senderBtn == ui->label_Router) {
        ui->label_Router->set_start(start);
        updateDeviceStatus(
            ui->label_Router_pic, ui->label_Router_status,
            ui->label_Router->get_start(),
            ":/img/Router_open.png", ":/img/Router_close.png",
            "NO", "OFF"
        );
    }

    // 窗帘
    if (senderBtn == ui->label_curtain) {
        ui->label_curtain->set_start(start);
        updateDeviceStatus(
            ui->label_curtain_pic, ui->label_curtain_status,
            ui->label_curtain->get_start(),
            ":/img/curtain_open.png", ":/img/curtain_close.png",
            "NO", "OFF"
        );
    }

    // 冰箱
    if (senderBtn == ui->label_fridge) {
        ui->label_fridge->set_start(start);
        updateDeviceStatus(
            ui->label_fridge_pic, ui->label_fridge_status,
            ui->label_fridge->get_start(),
            ":/img/fridge_open.png", ":/img/fridge_close.png",
            "NO", "OFF"
        );
    }

    // 空调
    if (senderBtn == ui->label_air_conditioner) {
        ui->label_air_conditioner->set_start(start);
        updateDeviceStatus(
            ui->label_air_conditioner_pic, ui->label_air_conditioner_status,
            ui->label_air_conditioner->get_start(),
            ":/img/air_conditioner_open.png", ":/img/air_conditioner_close.png",
            "NO", "OFF"
        );
    }

    // 灯
    if (senderBtn == ui->label_light) {
        ui->label_light->set_start(start);
        updateDeviceStatus(
            ui->label_light_pic, ui->label_light_status,
            ui->label_light->get_start(),
            ":/img/light_open.png", ":/img/light_close.png",
            "NO", "OFF"
        );
    }
}

// 更新场景模式下的设备状态
// isActive：场景是否激活（true=激活，false=未激活）
// dev1~dev5：场景关联的设备图标标签（数量根据场景类型变化）
void Widget_funcC_Smart_Home::updateSceneDevices(bool isActive, QLabel *dev1, QLabel *dev2, QLabel *dev3, QLabel *dev4, QLabel *dev5)
{
    // 归家/离家模式设备更新（5个设备参数）dev5不为空
    if (dev5) {
        dev1->setPixmap(isActive ? QPixmap(":/img/air_conditioner_open.png") : QPixmap(":/img/air_conditioner_close.png"));
        dev2->setPixmap(isActive ? QPixmap(":/img/light_open.png") : QPixmap(":/img/light_close.png"));
        dev3->setPixmap(isActive ? QPixmap(":/img/light_open.png") : QPixmap(":/img/light_close.png"));
        dev4->setPixmap(isActive ? QPixmap(":/img/cleaner_close.png") : QPixmap(":/img/cleaner_open.png"));
        dev5->setPixmap(isActive ? QPixmap(":/img/curtain_open.png") : QPixmap(":/img/curtain_close.png"));
    }
    // 起床/睡觉模式（有4个设备参数，dev4不为空，dev5为空）
    else if (dev4) {
        dev1->setPixmap(isActive ? QPixmap(":/img/light_open.png") : QPixmap(":/img/light_close.png"));
        dev2->setPixmap(isActive ? QPixmap(":/img/curtain_open.png") : QPixmap(":/img/curtain_close.png"));
        dev3->setPixmap(isActive ? QPixmap(":/img/light_open.png") : QPixmap(":/img/light_close.png"));
        dev4->setPixmap(isActive ? QPixmap(":/img/curtain_open.png") : QPixmap(":/img/curtain_close.png"));
    }
}

// 通用设备状态更新函数（统一处理单个设备的图标和状态文本）
// 参数说明：
// picLabel：显示设备图标的标签
// statusLabel：显示设备状态文本的标签
// isOn：设备是否开启（true=开启，false=关闭）
// onPic/offPic：开启/关闭状态的图标路径
// onText/offText：开启/关闭状态的显示文本
// 通用设备状态更新函数
void Widget_funcC_Smart_Home::updateDeviceStatus(
    QLabel *picLabel, QLabel *statusLabel,
    bool isOn, const QString &onPic, const QString &offPic,
    const QString &onText, const QString &offText)
{
    // 根据设备状态更新图标（开启显示onPic，关闭显示offPic）
    picLabel->setPixmap(isOn ? QPixmap(onPic) : QPixmap(offPic));
    // 根据设备状态更新文本（开启显示onText，关闭显示offText）
    statusLabel->setText(isOn ? onText : offText);
    
    statusLabel->setFont(QFont("楷体",12));  // 确保字体一致
}

// 预留消息发送槽函数（可扩展）
void Widget_funcC_Smart_Home::slots_button_send_message()
{
    // 示例：添加设备控制日志或弹窗提示
    // QMessageBox::information(this, "提示", "设备状态已更新");
}

